import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 读取图片
kids = cv.imread("image/kids.jpg")
# 显示图片
plt.imshow(kids[:, :, ::-1])
plt.show()

# 绝对尺寸(放大一倍)
rows, cols = kids.shape[:2] # (374, 500)
res = cv.resize(kids, (2 * cols, 2 * rows))
plt.imshow(res[:, :, ::-1])
plt.show()
print(res.shape)

# 相对尺寸(缩小一倍)
res1 = cv.resize(kids, None, fx=0.5, fy=0.5)
plt.imshow(res1[:, :, ::-1])
plt.show()
print(res1.shape)

# 图像平移(将图像的像素点移动50，100的距离)
M = np.float32([[1, 0, 100], [0, 1, 50]]) # 创建平移矩阵
res2 = cv.warpAffine(kids, M, (cols * 2, rows * 2))
plt.imshow(res2[:, :, ::-1])
plt.show()

# 图像旋转(旋转中心，旋转角度，缩放比例)
N = cv.getRotationMatrix2D((cols / 2, rows / 2), 45, 0.5) # 创建旋转矩阵
res3 = cv.warpAffine(kids, N, (cols, rows))
plt.imshow(res3[:, :, ::-1])
plt.show()

# 仿射变换
pts1 = np.float32([[50, 50], [200, 50], [50, 200]]) # 选取三个初始点的位置
pts2 = np.float32([[100, 100], [200, 50], [100, 250]]) # 三个点进行仿射变化后的位置
K = cv.getAffineTransform(pts1, pts2) # 创建仿射矩阵
res4 = cv.warpAffine(kids, K, (cols, rows))
plt.imshow(res4[:, :, ::-1])
plt.show()

# 投射变换
pst3 = np.float32([[56, 65], [368, 52], [28, 387], [389, 390]]) # 选取四个初始点的位置
pst4 = np.float32([[100, 145], [300, 100], [80, 290], [310, 300]]) # 四个点进行投射变化后的位置
T = cv.getPerspectiveTransform(pst3, pst4) # 创建投射矩阵
res5 = cv.warpPerspective(kids, T, (cols, rows))
plt.imshow(res5[:, :, ::-1])
plt.show()

# 图像金字塔
imgup = cv.pyrUp(kids) # 上采样
plt.imshow(imgup[:, :, ::-1])
plt.show()
imgdown = cv.pyrDown(kids) # 下采样
plt.imshow(imgdown[:, :, ::-1])
plt.show()